/**
 * MQC
 */
(function(){
    MQC = function (_opt){
        this.init(_opt);
    }
    MQC.prototype = {
        init:function(opt){
            var t = this;
            //MQ连接的ID
            t.clientID = new Date().getTime().toString();
            //连接配置
            t.config = opt;
            /*$.ajax({
                url: "project/config.json",//json文件位置
                type: "GET",//请求方式为get
                dataType: "json", //返回数据格式为json
                async: false,
                success: function (data) {//请求成功完成后要执行的方法 
                    t.config = data;
                }
            })*/
            try{
                //t.MQclient = new Paho.Client(t.config.MQIP,t.config.MQPort ,t.clientID);
                //client = new Messaging.Client(host, Number(port), clientId);
                t.MQclient = new Messaging.Client(t.config.MQIP, t.config.MQPort, t.clientID);
                //监听事件
                t.MQclient.onMessageArrived = function (msg) {
                    topic = msg.destinationName;
                    msg = eval('('+msg.payloadString+')');
                    t.showconsole && console.log("返回消息"+topic+JSON.stringify(msg)+new Date().getTime().toString())
                    t.trigger(topic,[msg,t]);
                };
                //失去连接
                t.MQclient.onConnectionLost = function(responseObject) {
                    if (responseObject.errorCode !== 0) {
                        t.cliented = false;
                        t.showconsole && console.log("失去连接:"+responseObject.errorMessage);
                        t.trigger(t.eves.clientlost,[responseObject.errorMessage,t]);
                    }
                }
            }catch(ex){}
        },
        /**
         * 连接方法
         */
        client:function(){
            var t = this;
            t.trigger(t.eves.beforclient,[t.MQclient,t]);
            //链接配置
            t.MQclient.connect({
                onSuccess: function () {
                    t.cliented = true;
                    t.showconsole && console.log("连接成功:"+t.config.MQIP);
                    t.trigger(t.eves.cliented,[t.MQclient,t]);
                },
                onFailure: function () {
                    t.cliented = false;
                    t.showconsole && console.log("连接失败:"+t.config.MQIP);
                    t.trigger(t.eves.clientFail,[t.MQclient,t]);
                }
            });
            return t;
        },
        /**
         * 订阅主题
         * @param string name 主题名
         */
        subscribe:function(name){
            var t = this;
            t.showconsole && console.log("开始订阅主题:"+name);
            t.MQclient.subscribe(name);
            return t;
        },
        /**
         * 推送消息主题
         * @param string name 主题名
         * @param string msg 信息
         */
        publish:function(name,msg){
            var t = this;
            if($.type(msg) !== "string"){
                msg = JSON.stringify(msg);
            }
            t.showconsole && console.log("推送主题:"+name +";消息为:"+msg);
            var message = new Messaging.Message(msg);
            message.destinationName = name;
            t.MQclient.send(message);
            return t;
        },
        /**
         * 事件集合
         */
        eve: {},
        /**
         * 事件名称 支持的所有事件要先在这里注册 方便查看以及修改
         */
        eves:{
            /**
             * 连接失败事件
             */
            clientFail:"clientFail",
            /**
             * 连接成功事件
             */
            cliented:"cliented",
            /**
             * 失去连接事件
             */
            clientlost:"clientlost",
            /**
             * 连接开始之前事件
             */
            beforclient:"beforclient"
        },
        /**
         * 注册事件
         * @param {string} ename  事件名称
         * @param {function} fun 回调方法
         */
        on: function (ename, fun) {
            var t = this;
            var dom = t.renderto || t.id;
            var enames = ename.split(" ");
            $.each(enames, function (n, name) {
                if (name) {
                    if (!t.eve[name]) { t.eve[name] = []; }
                    t.eve[name].push(fun);
                }
            });
        },
        /**
         * 注销事件
         * @param {string} ename  事件名称
         * @param {function} fun 回调方法
         */
        off: function (ename) {
            var t = this;
            var enames = ename.split(" ");
            $.each(enames, function (n, name) {
                if (name) {
                    if (!t.eve[name]) { t.eve[name] = []; }
                    t.eve[name] = [];
                }
            });
        },
        /**
         * 触发事件
         * @param {string} ename 事件名称
         * @param {array} args 参数
         */
        trigger: function (ename, args) {
            var t = this;
            var r = $.makeArray(args);
            //触发由on注册的事件
            if (t.eve[ename] && t.eve[ename].length > 0) {
                $.each(t.eve[ename], function (n, fn) {
                    t.doCallback(fn, r);
                });
            }
        },
        /**
         * 回调函数
         * @param {function} fn 回调方法
         * @param {array} args 参数
         */
        doCallback:function (fn, args) {
            return fn.apply(this, args);
        },
        //是否打开日志
        showconsole:true,
    }
})();